#!/bin/bash
# seuraaviin funktioihin passataan ainoastaan matriisin nimi. Matriisin jäsenillä saa olla joko numeerinen tai aakkosellinen arvo. Välilyöntejä ei saa olla.
# koska varaudutaan sparse tyyppisiin matriiseihin täytyy matriiseista kirjoittaa ja lukea sekä arvot että osoitteet. 
function tulosta_matriisi_näytölle () { 
(echo -n "Matriisin $1 jäsenten arvot     : "; eval echo -e \${$1[@]}
echo -n "Matriisin $1 jäsenten osoitteet : "; eval echo \${!$1[*]}) | column -t
echo
}

function kirjoita_matriisi_levylle () { 
eval echo  \${$1[@]} > ~/tiedosto1   # Matriisin $1 jäsenten arvot   
eval echo \${!$1[*]} > ~/tiedosto2   # Matriisin $1 jäsenten osoitteet
}

function lue_matriisi_levyltä () { 
unset $1 # varmistus sille että matriisi tosiaan luetaan levyltä eikä käytetä RAM:missa olevaa vanhaa kuvaa.
apu0=0
apu1=($(cat  ~/tiedosto1))
apu2=($(cat  ~/tiedosto2))
while true; do
  [[ -z ${apu1[$apu0]} ]] && break  
  eval "$1[${apu2[apu0]}]"="${apu1[apu0]}" 
  let apu0++
done
unset apu0 apu1 apu2  
}

# seuraavat lauseet tarkistavat että kaikki tapahtuu oikein. 
matriisi1[7]=55.5
matriisi1[123]=joo
matriisi1[334455]=-777
matriisi1[3]=15e23 # matriisin jäsenet voi määritellä missä järjestyklsessä haluaa. Tulostus tapahtuu kuitenkin osoitteiden suuruusjärjestyksessä.
echo matriisi1 ennen tallettamista levylle :
tulosta_matriisi_näytölle matriisi1
kirjoita_matriisi_levylle matriisi1
lue_matriisi_levyltä matriisi1
echo matriisi1 levytä lukemisen jälkeen:
tulosta_matriisi_näytölle matriisi1
echo

matriisi2=({a..z})
echo matriisi2 ennen tallettamista levylle:
tulosta_matriisi_näytölle matriisi2
kirjoita_matriisi_levylle matriisi2
lue_matriisi_levyltä matriisi2
echo matriisi2 levyltä lukemisen jälkeen:
tulosta_matriisi_näytölle matriisi2

 
